package main

import (
	"fmt"
	"io"
	"io/fs"
	"io/ioutil"
	"lark/src/evaluator"
	"lark/src/filemerge"
	"lark/src/lexer"
	"lark/src/object"
	"lark/src/parser"
	"os"
)

const PROMPT = ">>"

func main() {

	//打开cmd执行
	start(os.Stdin, os.Stdout)

}

func start(in io.Reader, out io.Writer) {
	// scanner := bufio.NewScanner(in)

	/*// 获取当前工作目录
	currentDir, errs := os.Getwd()
	if errs != nil {
		log.Fatal(errs)
	}
	 //从文件中获取
	input, err := ioutil.ReadFile(currentDir + "\\main.la")
	if err != nil {
		log.Fatal(err)
	} */
	// 获取当前工作目录下的代码
	inputText := filemerge.GetSourceCode()
	// fmt.Println(inputText)
	//创建符号表
	env := object.NewEnvironment()
	// 运行
	// Run(string(input), env)
	Run(inputText, env)
	for {

		/* // fmt.Fprintf(out, PROMPT)
		scanned := scanner.Scan()
		if !scanned {
			return
		}
		// 运行
		Run(string(input), env) */

	}

}

// 运行
func Run(code string, env *object.Environment) bool {

	lex := lexer.New(code)
	/* //循环打印token
	for tok := lex.NextToken(); tok.Type != lexer.EOF; tok = lex.NextToken() {
		fmt.Printf("%+v\n", tok)
	} */

	p := parser.New(lex)

	program := p.ParseProgram()
	if len(p.Errors()) != 0 {
		printParserErrors(p.Errors())
		return false
	}
	evaluator.Eval(program, env)
	return true
}

func printParserErrors(errors []string) {
	fmt.Println("Woops! We ran into some monkey business here!\n")
	fmt.Println(" parser errors:\n")
	for _, msg := range errors {
		fmt.Println("\t" + msg + "\n")
	}
}

// 保存日志
func saveLog(info string) {
	filePath := "output.txt"

	// 检查文件是否存在
	_, err := os.Stat(filePath)
	if os.IsNotExist(err) {
		// 文件不存在，创建并写入内容
		err = ioutil.WriteFile(filePath, []byte(info), 0644)
		if err != nil {
			fmt.Println("创建文件失败：", err)
			return
		}
		fmt.Println("文件已成功创建并写入")
	} else {
		// 文件存在，追加内容
		err = ioutil.WriteFile(filePath, []byte(info), fs.FileMode(os.O_APPEND))
		if err != nil {
			fmt.Println("写入文件失败：", err)
			return
		}
		fmt.Println("文件已成功追加内容")
	}
}
